#include "command.h"
int handler_gets(int sockfd, data msg, char *wk_path)
{
    // 拼接下载路径
    char *p = "/";
    char path_buf[104] = {0};
    char *path = getcwd(path_buf, sizeof(path_buf));
    strcat(path, p);
    strcat(path, msg.args);
    // 拼接上工作路径和文件名
    // char curr[1024] = {0};
    // char *p1 = "\0";
    // strcat(curr, p);
    // strcat(curr, msg.args);
    // strcat(curr, p1);
    // strcpy(msg.args, curr);
    // 发送给服务器拼接好了的路径和文件名用于判断文件是否存在
    send(sockfd, &msg, sizeof(data), MSG_NOSIGNAL);
    // 接收服务端发送的文件是否存在标记
    int count;
    recv(sockfd, &count, sizeof(int), MSG_WAITALL);
    if (count == 0)
    {
        printf("文件不存在!\n");
        return 0;
    }
    // 文件存在开始下载
    // 创建并打开文件
    int file_fd = open(path, O_RDWR | O_CREAT | O_APPEND, 0664);
    // 计算文件哈希值
    //char buf_hash[512] = {0};
    char *buf_hash;
    compute_sha256_hash(path, &buf_hash);
    // 发送文件哈希值
    send(sockfd, buf_hash, 512, MSG_NOSIGNAL);
    // 接收服务端返回值判断本地文件是否于与服务器文件一样
    int flag = -1000000000;
    recv(sockfd, &flag, sizeof(int), MSG_WAITALL);
    if (flag = 0)
    {
        printf("文件完整，下载完成!");
        return 0;
    }
    // 文件不完整，接收文件
    // 计算存在的文件大小
    off_t size = lseek(file_fd, 0, SEEK_END);
    // 发送存在的文件大小
    send(sockfd, &size, sizeof(off_t), MSG_NOSIGNAL);
    // 接收文件总大小
    off_t serve_size;
    recv(sockfd, &serve_size, sizeof(off_t), MSG_WAITALL);
    // 接收文件
    // 定义一个变量存储每次读取的数据块
    ssize_t chunk_size = 1024;
    char buf[1024] = {0};
    // 接受剩下的文件
    while(serve_size > size){
        // 每次重置buf,防止不够1024时，buf前半部分时上次的数据
        memset(buf, 0, sizeof(buf));
        // 计算应该读取的字节数
        off_t read_bytes = (serve_size - size) < chunk_size ? (serve_size - size) : chunk_size;
        // 实际读取的字节数
        off_t cur_size = recv(sockfd, buf, read_bytes, MSG_WAITALL);
        if (cur_size == 0){
            printf("端断开连接\n");
            break;
        }
        write(file_fd, buf, cur_size);
        // 累加当前文件以及存在的字节数
        size += cur_size;
        off_t need_size = serve_size - size;
        if(need_size <= 0){
            printf("文件下载完成!\n");
            break;
        }
    }
    return 0;
}